{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：Python爬虫有哪些常用框架？优缺点？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "为什么爬虫要用 Python 呢？因为开发速度快，可能不到半个小时你就能写出一个小爬虫。那么，Python 爬虫一般会用到什么框架？哪个框架好？很多新的项目在前期都会花很多时间去做调研，什么框架适合项目？面试官希望面试者具有对新技术的敏感性，以及具备快速学习的能力和决心。就我的个人经验而言，在短短几年的开发项目里，语言的变化性不会很大，但是框架的选择会根据项目的大小和内容去不断变化，包括与之配套的技术栈也是随之变化。\n",
    "\n",
    "如果你面试的职位是爬虫相关的，但你又从未接触过爬虫，那我建议在真实面试之前，最好自己写一个小的爬虫程序，然后把自己在开发过程中碰到的问题和瓶颈记录下来，比如爬取速度慢，爬取过程中的一些异常，自己是如何解决的？即使没有解决也没关系，可以把自己的思路和面试官分享一下，也可以向面试官验证一下自己的思路。面试并不是一个只有错与对的过程，很多时候它是和面试官团队建立联系的过程。\n",
    "\n",
    "答案\n",
    "常用框架：\n",
    "\n",
    "Scrapy\n",
    "Scrapy 是一个为了爬取网站数据，提取结构性数据而编写的应用框架。可以应用在包括数据挖掘，信息处理或存储历史数据等一系列的程序中。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据。\n",
    "\n",
    "优点：\n",
    "\n",
    "支持异步 request，快速爬取网站数据；\n",
    "极其灵活的定制化爬取；\n",
    "社区人数多、文档完善；\n",
    "URL去重采用布隆过滤器方案；\n",
    "可以处理不完整的HTML，Scrapy已经提供了selectors（一个在lxml的基础上提供了更高级的接口），可以高效地处理不完整的HTML代码；\n",
    "支持 shell 方式，易于调试，方便写一些统一的过滤器，通过管道的方式存入数据库；\n",
    "采取可读性更强的 xpath 代替正则强大的统计和 log 系统。\n",
    "缺点：\n",
    "\n",
    "不支持分布式部署；\n",
    "原生不支持抓取 JavaScript 的页面；\n",
    "基于 twisted 框架，运行中的 exception 是不会干掉 reactor，并且异步框架出错后是不会停掉其他任务的，数据出错后难以察觉。\n",
    "PySpider\n",
    "采用 Python 语言编写，分布式架构，支持多种数据库后端，强大的 WebUI 支持脚本编辑器，任务监视器，项目管理器以及结果查看器。\n",
    "\n",
    "优点：\n",
    "\n",
    "组件可替换，支持单机/分布式部署，支持 Docker 部署；\n",
    "完全可视化，对用户非常友好；\n",
    "脚本规则简单，开发效率高；\n",
    "支持抓取 JavaScript 的页面；\n",
    "内置 pyquery 选择器；\n",
    "webUI，界面更友好。\n",
    "缺点：\n",
    "\n",
    "使用上的人性化牺牲了灵活度，定制化能力降低。\n",
    "Crawley\n",
    "可以高速爬取对应网站的内容，支持关系和非关系数据库，数据可以导出为 JSON、XML 等。\n",
    "\n",
    "优点：\n",
    "\n",
    "支持多个数据库；\n",
    "命令行操作工具；\n",
    "易于上手。\n",
    "Portia\n",
    "是一个开源可视化爬虫工具，可让您在不需要任何编程知识的情况下爬取网站！简单地注释您感兴趣的页面，Portia 将创建一个蜘蛛来从类似的页面提取数据。\n",
    "\n",
    "优点：可视化，易于初学者上手。\n",
    "\n",
    "拓展\n",
    "首先，我们对爬虫有个概览。爬虫需要哪些知识？\n",
    "\n",
    "爬虫一般分为数据采集，数据分析和存储三个部分。\n",
    "\n",
    "由于 Python 易学易用，使得它在爬虫领域成为了主要的开发语言之一。那么，掌握 Python 语言的基本用法就是那把帮助你开启爬虫领域的钥匙。巧妇也难为无米之炊，所以，大家花点时间去学习Python，再好好地看我之前解析的Python面试题。\n",
    "\n",
    "其次，我们还必须知道 HTTP 协议和一些与爬虫相关的 Python 库。如何用 Python 从网络服务器请求信息，如何对服务器的响应进行基本处理，以及如何以自动化手段与网站进行交互。\n",
    "\n",
    "爬虫的基本原理就是通过网络请求从远程服务器下载数据的过程，而这个网络请求背后的技术就是基于 HTTP 协议。那么，和这个有关的 Python 库有哪些呢？网络请求库 requests 就是一个模拟浏览器发送 HTTP 请求的网络库。等到数据爬下来之后，大部分情况是 HTML 文本，也有少数是XML 格式或者 JSON 格式的数据。这些数据对于我们来说，没有意义。所以，我们要提取我们想要的数据。要想正确处理这些数据，你要熟悉每种数据类型的解决方案，比如：JSON 数据可以直接使用 Python 内建模块 json，对于 HTML 文本，可以使用 BeautifulSoup、lxml 等库去处理，对于 xml 数据，可以使用 untangle、xmltodict 等第三方库。还有一个比较通用的库 re 去处理正则表达式。\n",
    "\n",
    "采集整个网站，那是一种非常耗费内存资源的过程，尤其是处理大型网站时，最合适的工具就是用一个数据库来储存采集的资源。所有被爬虫抓取的网页过滤分析后得到的数据会被存储到数据库中，建立索引，这样也方便以后的查询和检索。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
